home *** CD-ROM | disk | FTP | other *** search
- #ifndef OTCL_OSERVER_H
- #define OTCL_OSERVER_H
-
- // System Includes
- #include <sys/types.h>
- #include <tcl.h>
-
- #include "OtclObject.H"
-
- // Message Type Identifiers
- #define INSTANCE_METHOD_RQST 'i'
- #define CLASS_METHOD_RQST 'c'
- #define DELETE_OBJECT_RQST 'd'
- #define NEW_OBJECT_RQST 'n'
- #define RESPONSE_MSG 'r'
- #define MIN_TCP_IP_PORT 1024
- #define MAX_TCP_IP_PORT 32767
-
- // Forward delcaration
- struct fd_set;
-
- class OtclChannel
- {
- public:
- OtclChannel (char *address, Tcl_Interp *, int &result);
- OtclChannel (int fd);
- ~OtclChannel ();
-
- int streamOut (char);
- int streamOut (long);
- int streamOutNullTerminated (char *);
-
- int streamIn (char &);
- int streamIn (long &);
- int streamInNullTerminated (char *&);
-
- int operator == (int fd);
- int getFd (void);
-
- private:
- int sendFull (char *, int);
- int recvFull (char *, int);
- int skt;
- };
-
- class OtclResponse;
- class OtclRequest;
-
- class OtclOserver
- {
- public: // Public Static Attributes
-
- static void (*addReadFd) (int);
- static void (*rmvReadFd) (int);
-
- public: // Public Static Methods
-
- static int initialiseCmd (Tcl_Interp *, int argc, char *argv[]);
- static int processCmd (Tcl_Interp *, int argc, char *argv[]);
- static int oserverCmd (Tcl_Interp *, int argc, char *argv[]);
- static int getAddressCmd (Tcl_Interp *, int argc, char *argv[]);
-
- static void readableFd (int);
-
- // Used to initialise the "currentThread" static attribute at
- // start up.
- static char *createOurThreadId (void);
-
- static OtclResponse *sendRequest (Tcl_Interp *, char *address, OtclRequest*);
-
- private: // Private static methods
-
- static void processRequest (int fd, Tcl_Interp *);
- static void cleanupIncommingChannel (int fd);
- static void processConnectionRequest (void);
-
- private: // Private Attribute
-
- // The file descriptor set for all of the incomming connections
- // including the listening channel (if this is a server)
- static fd_set *incommingFdSet;
-
- // A subset of the above set that contains all of the fd's that do not
- // have a request pending for a different thread of execution
- static fd_set *incommingFdSubset;
-
- // An array of OtclChannel's. OtclChannel object stored against their
- // array fd index.
- static OtclChannel **incommingChannel;
-
- // Array of strings of thread identifiers.
- static char **incommingThread;
-
- static OtclChannel *listener;
- static char *address;
-
- static char *currentThread;
-
- static Tcl_HashTable *outgoingChannel;
- };
-
- class OtclRequest
- {
- public:
- OtclRequest ();
- virtual ~OtclRequest ();
-
- virtual int streamIn (OtclChannel *) = 0;
- virtual int streamOut (OtclChannel *) = 0;
- virtual int perform (Tcl_Interp *interp) = 0;
- };
-
- class OtclInstanceMethodRqst : public OtclRequest
- {
- public:
-
- OtclInstanceMethodRqst ();
- OtclInstanceMethodRqst (char *symRef, char *method, long argc, char *argv[]);
- ~OtclInstanceMethodRqst ();
-
- int streamIn (OtclChannel *);
- int streamOut (OtclChannel *);
-
- int perform (Tcl_Interp *interp);
-
- private:
-
- void clear (void);
-
- char *symRef;
- char *method;
- long argc;
- char **argv;
- };
-
- class OtclDeleteObjectRqst : public OtclRequest
- {
- public:
- OtclDeleteObjectRqst ();
- OtclDeleteObjectRqst (char *symRef);
- ~OtclDeleteObjectRqst ();
-
- int streamIn (OtclChannel *);
- int streamOut (OtclChannel *);
-
- int perform (Tcl_Interp *interp);
-
- private:
-
- char *symRef;
-
- };
-
- class OtclNewObjectRqst : public OtclRequest
- {
- public:
- OtclNewObjectRqst ();
- OtclNewObjectRqst (char *className, long argc, char *argv[]);
- ~OtclNewObjectRqst ();
-
- int streamIn (OtclChannel *);
- int streamOut (OtclChannel *);
-
- int perform (Tcl_Interp *interp);
-
- private:
-
- char *className;
- long argc;
- char **argv;
-
- };
-
- class OtclClassMethodRqst : public OtclRequest
- {
- public:
- OtclClassMethodRqst ();
- OtclClassMethodRqst (char *name, char *method, long argc, char *argv[]);
- ~OtclClassMethodRqst ();
-
- int streamIn (OtclChannel *);
- int streamOut (OtclChannel *);
-
- int perform (Tcl_Interp *interp);
-
- private:
-
- void clear (void);
-
- char *name;
- char *method;
- long argc;
- char **argv;
- };
-
- class OtclResponse
- {
- public:
- OtclResponse ();
- OtclResponse(int returnValue, Tcl_Interp *interp);
- OtclResponse(int returnValue, char *result);
- ~OtclResponse ();
-
- int streamIn (OtclChannel *);
- int streamOut (OtclChannel *);
-
- void setTclInterp (Tcl_Interp *);
- int getReturnValue (void);
-
- private:
-
- void clear (void);
-
- long returnValue;
- char *result;
- };
-
- class OtclRemoteObject : public OtclObject
- {
- public:
- OtclRemoteObject (char *symRef, int &result, Tcl_Interp *interp);
- ~OtclRemoteObject ();
-
- int executeMethod (Tcl_Interp *interp, char *method, int argc, char *argv[]);
- int discard (Tcl_Interp *, int fromCpp);
-
- // A static version of the above method for the deletion
- // or a remote object that hasn't been used locally and therefore
- // doesn't have a proxy object.
- static int discard (Tcl_Interp *, char *symRef);
-
- private:
- char *remoteSymRef;
- char *address;
- };
-
- class OtclRemoteClass
- {
- public:
- OtclRemoteClass (Tcl_Interp *interp, char *name, char *address);
- ~OtclRemoteClass ();
- int instantiate (Tcl_Interp *, int argc, char *argv[]);
- static int classCmd (ClientData, Tcl_Interp *, int argc, char *argv[]);
- int classMethod (Tcl_Interp *, int argc, char *argv[]);
- void setAddress (char *address, char *realName);
- private:
- char *name;
- char *address;
- };
-
- #endif
-